import axios from 'axios'
import uuidv4 from 'uuid/v4'
// import { shareLog } from './log';
import Vue from 'vue'

class wxUtil {
    static debug = false;
    static configJsApiList = [
        "updateAppMessageShareData", // 分享接口  
        "updateTimelineShareData", // 分享接口  
        "onMenuShareTimeline", // 分享接口  即将放弃
        "onMenuShareAppMessage", // 分享接口  即将放弃
        "onMenuShareQQ",  // 分享菜单->qq 即将放弃
        "onMenuShareWeibo",  // 分享菜单->微博
        "onMenuShareQZone",  // 分享菜单->qq空间 
        // "startRecord",  // 录音接口 开始记录
        // "stopRecord",  // 录音接口 停止记录
        // "onVoiceRecordEnd",  // 当声音记录停止
        // "playVoice",  // 播放声音
        // "pauseVoice",  // 暂停声音
        // "stopVoice",  // 停止声音
        // "onVoicePlayEnd",  // 当声音播放结束
        // "uploadVoice",  // 上传声音
        // "downloadVoice",  // 下载声音
        // "translateVoice",  // 识别音频并返回识别结果接口 翻译声音
        // "getNetworkType",  // 获得网络类型 2g，3g，4g，wifi
        // "openLocation",  // 打开位置 使用微信内置地图查看位置接口
        // "getLocation" , // 获取地理位置接口 默认为wgs84的gps坐标，如果要返回直接给openLocation用的火星坐标，可传入'gcj02'
        "hideOptionMenu",  // 隐藏选项菜单
        "showOptionMenu",  // 显示选项菜单
        "hideMenuItems",  // 隐藏菜单项 批量隐藏功能按钮接口
        "showMenuItems",  // 显示菜单项  批量显示功能按钮接口
        "hideAllNonBaseMenuItem",  // 隐藏所有非基础按钮接口
        "showAllNonBaseMenuItem",  // 显示所有功能按钮接口
        "closeWindow",  // 关闭当前网页窗口接口
        "scanQRCode",  // 微信扫一扫 
        // "chooseWXPay", // 发起一个微信支付请求
        // "openProductSpecificView", // 跳转微信商品页接口
        // "addCard" , // 批量添加卡券接口
        // "chooseCard" , // 拉取适用卡券列表并获取用户选择信息
        // "openCard" ,  // 查看微信卡包中的卡券接口
        "chooseImage",  // 选择图片
        "previewImage",  // 预览图片
        "uploadImage",  // 上传图片
        "downloadImage",  // 下载图片 
    ]
    static qywxConfigJsApiList = [
        'showMenuItems',
        'onMenuShareWechat', //微信
        'onMenuShareTimeline', //朋友圈
        'onMenuShareAppMessage', //转发
    ]

    static initConfigLoading = false // wx  config 加载状态
    static isXMLHTTPAddShare = false //  分享后 是否 调用接口

    // 微信配置
    static config = {}
    // 执行 configJsApiList 中已经有的 权限   
    static executeOptions = {}
    // 区别个人微信 wx  和企业微信   qywx
    static type
    // 分享后调用接口所需要的参数
    static XMLHTTPAddShareOption = {}

    static async initConfig() {
        let u = navigator.userAgent;
        let isAndroid = u.indexOf('app/2') != -1; //android终端
        let isiOS = u.indexOf('app/3') != -1; //ios终端
        if (isAndroid || isiOS) return
        let ua = window.navigator.userAgent;
        this.type = ua.includes('wxwork') ? 'qywx' : (ua.includes('MicroMessenger') ? 'wx' : 'other');
        if (!this.is_weixin()) return
        if (this.initConfigLoading) return
        if (typeof window.wx == "undefined")
            await this.loadJS("https://res.wx.qq.com/open/js/jweixin-1.2.0.js")
        let loading = await this.getConfig()
        if (loading)
            this.initConfigLoading = await this.setConfig()

    }
    //取参
    static SetXMLHTTPAddShareOption({ oldLinkId, productId, type = 1, from = "wechat" }) {
        this.XMLHTTPAddShareOption = {
            oldLinkId,
            type,
            from,
            productId,
            newLinkId: uuidv4()
        }
        this.isXMLHTTPAddShare = true
    }
    //获取config配置的参数。区分微信和企业微信
    static async getConfig() {
        this.initConfigLoading = false
        return await axios.get(this.type == "wx" ? `http://39.98.134.216/wxConfig/getConfig.php` : `/qywx-elec/wechat-config`, {
            params: { url: location.href.split('#')[0] }
        }).then(res => { 
            this.config = {
                appId: res.data.appId,
                timestamp: res.data.timestamp,
                nonceStr: res.data.nonceStr,
                signature: res.data.signature,
            }
            if (this.type == "qywx")
                this.config.beta = true // 必须这么写，否则wx.invoke调用形式的jsapi会有问题
            return true

        }).catch(err => {
            return false
        })
    }

    static execute(jsApiList) {
        jsApiList = jsApiList || [] 
        if (!jsApiList.length) return
        // 判断当前客户端版本是否支持指定JS接口，
        //遍历所有可支持的js接口，根据页面传进来的配置项进行操作；
        wx.ready(() => {
            wx.checkJsApi({
                jsApiList:[...jsApiList],
                success: (res) => {
                    jsApiList.map(item => {
                        if (item == "hideOptionMenu") wx.hideOptionMenu();
                        else if (item == "showOptionMenu") wx.showOptionMenu();
                        else if (item == "updateAppMessageShareData") this._updateAppMessageShareData(this.executeOptions.updateAppMessageShareData)
                        else if (item == "updateTimelineShareData") this._updateTimelineShareData(this.executeOptions.updateTimelineShareData)
                        else if (item == "onMenuShareTimeline") this._onMenuShareTimeline(this.MakeXMLHTTPAddShareOption(this.executeOptions.onMenuShareTimeline, "timeline"))//转发给好友
                        else if (item == "onMenuShareAppMessage") this._onMenuShareAppMessage(this.MakeXMLHTTPAddShareOption(this.executeOptions.onMenuShareAppMessage, "app-message"))//分享到朋友圈
                        else if (item == "onMenuShareQQ") this._onMenuShareQQ(this.executeOptions.onMenuShareQQ)
                        else if (item == "onMenuShareWeibo") this._onMenuShareWeibo(this.executeOptions.onMenuShareWeibo)
                        else if (item == "onMenuShareQZone") this._onMenuShareQZone(this.executeOptions.onMenuShareQZone)
                        else if (item == "chooseImage") this._chooseImage(this.executeOptions.chooseImage)
                        else if (item == "previewImage") this._previewImage(this.executeOptions.previewImage)
                        else if (item == "uploadImage") this._uploadImage(this.executeOptions.uploadImage)
                        else if (item == "downloadImage") this._downloadImage(this.executeOptions.downloadImage)
                        else if (item == "closeWindow") wx.closeWindow();
                        else if (item == "hideMenuItems") this._make_menuItems("hideMenuItems", this.executeOptions.hideMenuItems)
                        else if (item == "showMenuItems") this._make_menuItems("showMenuItems", this.executeOptions.showMenuItems)
                        else if (item == "hideAllNonBaseMenuItem") wx.hideAllNonBaseMenuItem()
                        else if (item == "showAllNonBaseMenuItem") wx.showAllNonBaseMenuItem()
                        else if (item == "scanQRCode") this._scanQRCode(this.executeOptions.scanQRCode)
                        else if (item == "chooseWXPay") this._chooseWXPay(this.executeOptions.chooseWXPay)


                    })
                }
            });
        })
    }

    static _chooseWXPay(option) {
        if (!option) return
        wx.chooseWXPay({
            // timestamp: 0, // 支付签名时间戳，注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
            // nonceStr: '', // 支付签名随机串，不长于 32 位
            // package: '', // 统一支付接口返回的prepay_id参数值，提交格式如：prepay_id=\*\*\*）
            // signType: '', // 签名方式，默认为'SHA1'，使用新版支付需传入'MD5'
            // paySign: '', // 支付签名
            // success: function (res) {

            //     // 支付成功后的回调函数
            // },
            ...option
        });
    }

    static _scanQRCode(option) {
        if (!option) return
        wx.scanQRCode({
            // needResult: 0, // 默认为0，扫描结果由微信处理，1则直接返回扫描结果，
            // scanType: ["qrCode", "barCode"], // 可以指定扫二维码还是一维码，默认二者都有
            // success: function (res) {
            //     //   var result = res.resultStr; // 当needResult 为 1 时，扫码返回的结果
            // },
            ...option
        });
    }

    static _make_menuItems(type, option) {
        if (!option) return
        wx[type]({
            // menuList: [], // 要隐藏的菜单项，只能隐藏“传播类”和“保护类”按钮 或者  要显示的菜单项 ，所有menu项见附录3  
            ...option
        });
        // 传播类
        // 发送给朋友: "menuItem:share:appMessage" 
        // 分享到朋友圈: "menuItem:share:timeline" 
        // 分享到QQ: "menuItem:share:qq" 
        // 分享到Weibo: "menuItem:share:weiboApp" 
        // 收藏: "menuItem:favorite" 
        // 分享到FB: "menuItem:share:facebook" 
        // 分享到 QQ 空间 "menuItem:share:QZone"

    }

    static _downloadImage(option) {
        if (!option) return
        wx.downloadImage({
            // serverId: '', // 需要下载的图片的服务器端ID，由uploadImage接口获得
            // isShowProgressTips: 1, // 默认为1，显示进度提示
            // success: function (res) {
            //     //   var localId = res.localId; // 返回图片下载后的本地ID
            // },
            ...option
        });
    }

    static _uploadImage(option) {
        if (!option) return
        wx.uploadImage({
            // localId: '', // 需要上传的图片的本地ID，由chooseImage接口获得
            // isShowProgressTips: 1, // 默认为1，显示进度提示
            // success: function (res) {
            //     //   var serverId = res.serverId; // 返回图片的服务器端ID
            // },
            ...option
        })
    }

    static _previewImage(option) {
        if (!option) return
        wx.previewImage({
            // current: '', // 当前显示图片的http链接
            // urls: [], // 需要预览的图片http链接列表
            ...option
        });
    }

    static _chooseImage(option) {
        if (!option) return
        wx.chooseImage({
            // count: 1, // 默认9
            // sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图，默认二者都有
            // sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机，默认二者都有
            // success: function (res) {
            //     // var localIds = res.localIds; // 返回选定照片的本地ID列表，localId可以作为img标签的src属性显示图片
            // },
            ...option
        });
    }

    static _onMenuShareQZone(option) {
        if (!option) return
        wx.onMenuShareQZone({
            // title: '', // 分享标题
            // desc: '', // 分享描述
            // link: '', // 分享链接
            // imgUrl: '', // 分享图标
            // success: function () {
            //     // 用户确认分享后执行的回调函数
            // },
            // cancel: function () {
            //     // 用户取消分享后执行的回调函数
            // },
            ...option
        });

    }

    static _onMenuShareWeibo(option) {
        if (!option) return
        wx.onMenuShareWeibo({
            // title: '', // 分享标题
            // desc: '', // 分享描述
            // link: '', // 分享链接
            // imgUrl: '', // 分享图标
            // success: function () {
            //     // 用户确认分享后执行的回调函数
            // },
            // cancel: function () {
            //     // 用户取消分享后执行的回调函数
            // },
            ...option
        });

    }

    static _onMenuShareQQ(option) {
        if (!option) return
        wx.onMenuShareQQ({
            // title: '', // 分享标题
            // desc: '', // 分享描述
            // link: '', // 分享链接
            // imgUrl: '', // 分享图标
            // success: function () {
            //     // 用户确认分享后执行的回调函数
            // },
            // cancel: function () {
            //     // 用户取消分享后执行的回调函数
            // },
            ...option
        });
    }

    static _onMenuShareAppMessage(option) {
        if (!option) return
        wx.onMenuShareAppMessage({
            // title: '', // 分享标题
            // desc: '', // 分享描述
            // link: '', // 分享链接，该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
            // imgUrl: '', // 分享图标
            // type: '', // 分享类型,music、video或link，不填默认为link
            // dataUrl: '', // 如果type是music或video，则要提供数据链接，默认为空
            // success: function () {
            //     // 用户点击了分享后执行的回调函数
            // },
            ...option
        })
    }

    static _onMenuShareTimeline(option) {
        if (!option) return
        wx.onMenuShareTimeline({
            // title: '', // 分享标题
            // link: '', // 分享链接，该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
            // imgUrl: '', // 分享图标
            // success: function () {
            //     // 用户点击了分享后执行的回调函数
            // },
            ...option
        })
    }

    static _updateTimelineShareData(option) {
        if (!option) return
        wx.updateTimelineShareData({
            title: '', // 分享标题
            link: '', // 分享链接，该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
            imgUrl: '', // 分享图标
            success: function () {
                // 设置成功
            },
            ...option
        })
    }

    static _updateAppMessageShareData(option) {
        if (!option) return
        wx.updateAppMessageShareData({
            title: '', // 分享标题
            desc: '', // 分享描述
            link: '', // 分享链接，该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
            imgUrl: '', // 分享图标
            success: function () {
                // 设置成功
            },
            ...option
        })
    }
    //添加微信权限
    static async setConfig() {
        let _this = this
        return await (new Promise(function (resolve, reject) {
            wx.config({
                debug: _this.debug,
                ..._this.config,
                jsApiList: _this.type == 'wx' ? _this.configJsApiList : _this.qywxConfigJsApiList
            });
            // 先加载微信权限
            wx.ready(function () {
                resolve(true)
            })
            wx.error(function (res) {
                console.log("res")
                // config信息验证失败会执行error函数，如签名过期导致验证失败，具体错误信息可以打开config的debug模式查看，也可以在返回的res参数中查看，对于SPA可以在这里更新签名。
                reject(false)
            });
        }))
    }
    //微信环境
    static is_weixin() {
        var ua = navigator.userAgent.toLowerCase();
        if (ua.match(/MicroMessenger/i) == "micromessenger") { return true; } else { return false; }
    }
    //调用分享
    static MakeXMLHTTPAddShareOption(option, to) {
        return {
            ...option,
            success: () => {
                if (this.isXMLHTTPAddShare)
                    this.XMLHTTPAddShare(to)
                option.success && option.success()
            }
        }
    }
    //分享成功之后回调
    static XMLHTTPAddShare(to) {
        let type = this.XMLHTTPAddShareOption.type
        let productId = this.XMLHTTPAddShareOption.productId
        delete this.XMLHTTPAddShareOption.type
        delete this.XMLHTTPAddShareOption.productId
        axios.post('/share-link/share-success', {
            ...this.XMLHTTPAddShareOption,
            url: `/${(type == 1) ? 'product' : 'hotinfo'}/${productId}`,
            to
        }).then(function (res) {
            if (res.data.errCode == 0) {
                let pageType = '';
                if (type == 1) {
                    pageType = 'Prod';
                } else if (type == 2) {
                    pageType = 'Info';
                }
                // shareLog(pageType, productId, this.XMLHTTPAddShareOption.newLinkId, this.XMLHTTPAddShareOption.oldLinkId, res.data.data.businessRoot);
            }
            else {
                Vue.$vux.toast.text(res.data.errMsg, 'middle');
            }
        }).catch(function (err) {
        })
    }
    //加载js文件
    static async loadJS(url) {
        await (new Promise(function (resolve, reject) {
            // 一段耗时的异步操作
            var domScript = document.createElement('script');
            domScript.src = url;
            domScript.onload = domScript.onreadystatechange = function () {
                if (!this.readyState || 'loaded' === this.readyState || 'complete' === this.readyState) {
                    resolve()
                    this.onload = this.onreadystatechange = null;
                    this.parentNode.removeChild(this);
                }
            }
            document.getElementsByTagName('head')[0].appendChild(domScript);

        }))
    }
    // 获取分享跳转链接
    static getShareLinkUrl(option) {
        let { router, productId } = option
        return axios.defaults.baseURL + `/static/index.html?router=${router}&id=${productId}&linkId=${this.XMLHTTPAddShareOption.newLinkId}`
        // return axios.defaults.baseURL + `/static/index.html?${path}=list&id=${productId}&linkId=` + this.XMLHTTPAddShareOption.newLinkId
    }
}

export default wxUtil